package br.com.sms.action;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import br.com.sms.dominio.Cliente;
import br.com.sms.dominio.Funcionalidade;
import br.com.sms.dominio.Perfil;
import br.com.sms.dominio.Usuario;
import br.com.sms.enuns.TipoFuncionalidade;
import br.com.sms.excecao.SmsException;
import br.com.sms.util.Mensagens;
import br.com.sms.util.MensagensErro;

import com.opensymphony.xwork2.ActionContext;

public class PerfilAction extends Action {

	private Perfil perfil;
	private List<Perfil> perfis;
	private TipoFuncionalidade[] tipoFuncoes = TipoFuncionalidade.getTipos();
	private List<String> descricaoTipo;
	private List<Cliente> clientes;


	public String novoPerfil(){
		if(isAdminGeral())
			clientes = getClienteFacade().recuperarTodos();

		return TELA_NOVO_PERFIL;
	}

	public String salvarPerfil(){
		List<Integer> marcados = getSelecionados();
		try {
			getPerfilFacade().validarCampos(perfil, marcados);

			if(isAdminGeral())
				//perfil.setCliente(getClienteFacade().recuperarCliente(this.perfil.getCliente().getId()));
			//else
				//perfil.setCliente(getCliente());

			getPerfilFacade().salvar(perfil, marcados);
			mensagens.put("menasgem", Mensagens.PERFIL_SALVO);
			apresentarMensagens();
			return TELA_INICIAL;
		} catch (SmsException e) {
			erros.put("erro", e.getMessage());
			apresentarErros();
			return TELA_NOVO_PERFIL;
		}
	}


	public String listarPerfis(){
		setMenuAtual(1);
		if(isAdminGeral())
			this.perfis = getPerfilFacade().recuperarPerfis();
		else
			this.perfis = getPerfilFacade().recuperarPerfis(getCliente());

		return TELA_LISTA_PERFIL;

	}

	public String excluirPerfil(){
		setMenuAtual(1);
		if(isPodeExcluirPerfil(perfil)){
			getPerfilFacade().excluir(this.perfil);
			mensagens.put("mensagem", Mensagens.PERFIL_EXCLUIDO);
			apresentarMensagens();
			listarPerfis();
			return TELA_LISTA_PERFIL;
		}else{
			erros.put("erro", MensagensErro.PERFIL_EM_USO);
			apresentarErros();
			listarPerfis();
			return TELA_LISTA_PERFIL;
		}
	}

	public String carregarPerfilEdicao(){
		setMenuAtual(1);
		novoPerfil();
		this.perfil = getPerfilFacade().recuperarPerfil(perfil);

		if(this.perfil.getFuncionalidades() != null && this.perfil.getFuncionalidades().size() > 0){
			this.descricaoTipo = new ArrayList<String>();
			for (Funcionalidade fu : this.perfil.getFuncionalidades()) {
				descricaoTipo.add(fu.getTipoFuncionalidade().getDescricao());
			}
		}

		return TELA_EDICAO_PERFIL;
	}

	private boolean isPodeExcluirPerfil(Perfil perfil){
		List<Usuario> lista = getUsuarioFacade().recuperarUsuarios(perfil);
		if(lista == null || lista.size() == 0){
			return true;
		}else{
			return false;
		}
	}

	private List<Integer> getSelecionados(){
		List<Integer> marcados = new ArrayList<Integer>();
		//pego todas as chaves dos parâmetros

		Map<String, Object> parametros = ActionContext.getContext().getParameters();

		if(parametros != null){
			for (Object chave : parametros.keySet()){
				//aqueleas que começam por "role-"
				if (String.valueOf(chave).startsWith("tipo-")){
					//quebro a String pelo token -, e pego a segunda posicao que contém o saram
					String codigoDest = String.valueOf(chave).split("-")[1];
					//recupero o conteúdo do checkbox
					Object obj = ActionContext.getContext().getParameters().get("tipo-"+codigoDest);

					String[] opcao = null;
					//se ele for um String[] é por que foi submetido corretamente
					if (obj instanceof String[]){
						opcao = (String[]) obj;
					}
					//verifico se o conteúdo do checkbox é true, ou seja, foi selecionado
					if (opcao != null && opcao[0].equalsIgnoreCase("true")){
						marcados.add(Integer.parseInt(codigoDest));
					}
				}
			}
		}
		return marcados;
	}

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public List<Perfil> getPerfis() {
		return perfis;
	}

	public void setPerfis(List<Perfil> perfis) {
		this.perfis = perfis;
	}

	public TipoFuncionalidade[] getTipoFuncoes() {
		return tipoFuncoes;
	}

	public void setTipoFuncoes(TipoFuncionalidade[] tipoFuncoes) {
		this.tipoFuncoes = tipoFuncoes;
	}

	public List<String> getDescricaoTipo() {
		return descricaoTipo;
	}

	public void setDescricaoTipo(List<String> descricaoTipo) {
		this.descricaoTipo = descricaoTipo;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}



}
